home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 3 / Amiga Format CD03 (1996-07-04)(Future Publishing)(GB)(Track 1 of 6)[!][issue 1996-08].iso / comms / netsoftware / nethandler.lha / NetHandler / handler / mount.c < prev    next >
C/C++ Source or Header  |  1989-09-16  |  5KB  |  157 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  2. /* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery.  All Rights  */
  3. /* |. o.| || Reserved.  This program may not be distributed without the    */
  4. /* | .  | || permission of the authors:                            BBS:    */
  5. /* | o  | ||   John Toebes     Doug Walker    Dave Baker                   */
  6. /* |  . |//                                                                */
  7. /* ======                                                                  */
  8. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  9. /* Volume Manipulation */
  10. /* mount */
  11. #include "handler.h"
  12.  
  13. /* Define a BCPL volume name as a default */
  14. #define NETNAME "\7Network"
  15.  
  16. void DisMount(global)
  17. GLOBAL global;
  18. {
  19.    struct DeviceList *volume;
  20.    struct DosInfo *info;
  21.    struct RootNode *root;
  22.  
  23.    BUG(("Dismount: Entry\n"));
  24.  
  25.    /* start at the root of the device list */
  26.    root   = (struct RootNode   *)DOSBase->dl_Root;
  27.    info   = (struct DosInfo    *)BADDR(root->rn_Info);
  28.    volume = (struct DeviceList *)BADDR(info->di_DevInfo);
  29.  
  30.    /* See if we have a current volume that we have to get rid of ? */
  31.    /* Make sure there are no outstanding locks for the volume */
  32.    if ((global->volume != NULL) && (global->volume->dl_Lock == NULL))
  33.       {
  34.       /* This volume needs to be removed from the list */
  35.       /* First locate it on the list */
  36.       Forbid();
  37.  
  38.       /* is it at the head of the list? */
  39.       if (volume == global->volume)
  40.          /* sure enough, just get rid of it */
  41.          info->di_DevInfo = volume->dl_Next;
  42.       else
  43.          {
  44.          /* Find it in the list */
  45.          while(volume != NULL &&
  46.             (struct DeviceList *)(BADDR(volume->dl_Next)) != global->volume)
  47.             volume = (struct DeviceList *)BADDR(volume->dl_Next);
  48.  
  49.          /* if we found it then take it out of the chain */
  50.          if (volume != NULL)
  51.             volume->dl_Next = global->volume->dl_Next;
  52.          }
  53.       Permit();
  54.  
  55.       if (global->volume)
  56.          {
  57.          DosFreeMem((char *)global->volume);
  58.          }
  59.       }
  60.  
  61.    global->volume = NULL;
  62. }
  63.  
  64. void Mount(global, name)
  65. GLOBAL global;
  66. char *name;
  67. {
  68.    struct DeviceList *volume;
  69.    struct DosInfo *info;
  70.    struct RootNode *root;
  71.    short newlen; /* Cause memcmp to use the most efficient code */
  72.  
  73.    BUGP("Mount: Entry")
  74.    BUG(("Mount: Entry\n"));
  75.  
  76.    global->n.ErrorCount = 0;
  77.  
  78.    if(name == NULL) name = NETNAME;
  79.    newlen = *name + 1;
  80.  
  81.    /* Now find it on the device list. */
  82.    /* First start at the root of the device list */
  83.    root   = (struct RootNode   *)DOSBase->dl_Root;
  84.    info   = (struct DosInfo    *)BADDR(root->rn_Info);
  85.    volume = (struct DeviceList *)BADDR(info->di_DevInfo);
  86.  
  87.    BUGBSTR("Volume name is : ", name);
  88.  
  89.    /* Can't let the system change the list underneath us...        */
  90.    Forbid();
  91.    
  92.    /* Now run through the list until we come up empty OR we find it */
  93.    while(volume != NULL)
  94.       {
  95.       if (volume->dl_Type == DLT_VOLUME                               &&
  96.           !memcmp(name, (char *)BADDR(volume->dl_Name), newlen)    &&
  97.           volume->dl_VolumeDate.ds_Days   == 0L                       &&
  98.           volume->dl_VolumeDate.ds_Minute == 0L                       &&
  99.           volume->dl_VolumeDate.ds_Tick   == 0L)
  100.          break;
  101.       volume = (struct DeviceList *)BADDR(volume->dl_Next);
  102.       }
  103.  
  104.    Permit();
  105.  
  106.    BUG(("mount: Volume is %08lx\n", volume));
  107.  
  108.    /* OK, now did we find it? */
  109.    if (volume != NULL)
  110.       {
  111.       BUGP("Got volume")
  112.       BUG(("Got a matching node\n"));
  113.  
  114.       /* Sure did, We probably need to check to see if another handler has */
  115.       /* it to work with, but for now we assume only onw such volume can   */
  116.       /* exist.  This was a problem with all but the latest version of 1.2 */
  117.       /* If we have write access, we should probably nudge the ticks by one*/
  118.       /* just to make it unique                                            */
  119.       }
  120.    else
  121.       /* No such volume is known to the system.  So we will just have to   */
  122.       /* allocate a node to put everything on.                             */
  123.       {
  124.       BUGP("No volume")
  125.       volume = (struct DeviceList *)
  126.                DosAllocMem(global, sizeof(struct DeviceList)+newlen);
  127.  
  128.       BUG(("Created new node at %08lx\n", volume));
  129.  
  130.       /* Note that volume+1 gets us to the extra memory we allocated.  */
  131.       /* Just a lot simpler to write that in C than ...+sizeof(...)    */
  132.       MQ(name, (char *)(volume + 1), newlen);
  133.       volume->dl_VolumeDate.ds_Days   = 3800L;
  134.       volume->dl_VolumeDate.ds_Minute = 
  135.       volume->dl_VolumeDate.ds_Tick   = 0L;
  136.       volume->dl_Name = (BSTR)MKBADDR((volume + 1));
  137.       volume->dl_Lock = NULL;
  138.       volume->dl_Type = DLT_VOLUME;
  139.  
  140.       /* Also we need to link it into the list */
  141.       Forbid();
  142.       volume->dl_Next = info->di_DevInfo;
  143.       info->di_DevInfo = MKBADDR(volume);
  144.       Permit();
  145.       }
  146.  
  147.    /* Now we can own the volume by giving it our task id */
  148.    volume->dl_Task = global->n.port;
  149.    volume->dl_DiskType = ID_DOS_DISK;
  150.  
  151.    /* all set up, remember what our base volume is */
  152.    global->volume = volume;
  153.  
  154.    BUGP("Mount: Exit")
  155. }
  156.  
  157.